home *** CD-ROM | disk | FTP | other *** search
- ; customization program
-
- ; ID bytes
-
- ID0 = 017H
- ID1 = 0FDH
- ID2 = 046H
- ID3 = 00FH
- ID4 = 074H
- ID5 = 0B3H
-
- ; ASCII control characters
-
- CR = 13
- LF = 10
- TAB = 9
- SPACE = 32
-
- ; working storage
-
- X0 EQU BYTE PTR [BP]
- X1 EQU BYTE PTR [BP+1]
- X2 EQU BYTE PTR [BP+2]
- X3 EQU BYTE PTR [BP+3]
- X4 EQU BYTE PTR [BP+4]
- X5 EQU BYTE PTR [BP+5]
- FILE_NOT_CUSTOMIZABLE EQU BYTE PTR [BP+6]
- CHARACTER EQU BYTE PTR [BP+7]
- CHANGE_FLAG EQU BYTE PTR [BP+8]
- MS_FILE_POSITION EQU WORD PTR [BP+10]
- LS_FILE_POSITION EQU WORD PTR [BP+12]
- PARAMETER EQU WORD PTR [BP+14]
- OLD_PARAMETER EQU WORD PTR [BP+16]
- LINE_BUFFER_LENGTH EQU BYTE PTR [BP+18]
- DEFAULT_STRING_LENGTH EQU BYTE PTR [BP+19]
- LINE_BUFFER EQU BYTE PTR [BP+20]
- END_LINE_BUFFER EQU BYTE PTR [BP+25]
-
- HANDLE EQU BX
- BUFFER_SIZE EQU CX
- BUFFER EQU DX
-
-
- CODE SEGMENT
- ASSUME CS:CODE, DS:CODE
-
- ORG 100H
- BEGIN PROC NEAR
-
- MOV BX,128 ; find command line argument
- CLD
- LOOP1: INC BX
- CMP BYTE PTR [BX],SPACE
- JE LOOP1
- CMP BYTE PTR [BX],TAB
- JE LOOP1
- CMP BYTE PTR [BX],CR
- JNE OUT1
- CALL ERROR_EXIT
- DB 'File specifications missing', CR, LF, '$'
- OUT1: MOV DX,BX
- LOOP2: INC BX ; supply terminating zero
- CMP BYTE PTR [BX],SPACE
- JE OUT2
- CMP BYTE PTR [BX],TAB
- JE OUT2
- CMP BYTE PTR [BX],CR
- JNE LOOP2
- OUT2: MOV BYTE PTR [BX],0
- MOV AX,3D02H ; open file to read and write
- INT 21H
- JNC OPENED
- CALL ERROR_EXIT
- DB 'File not found or read/write access denied', CR, LF, '$'
- OPENED: MOV BP,OFFSET ID_BUFFER ; reserve space for variables
- MOV BUFFER,OFFSET ID_BUFFER+26
- MOV BUFFER_SIZE,SP
- SUB BUFFER_SIZE,OFFSET ID_BUFFER+26+256
- JBE ISM
- CMP BUFFER_SIZE,1024 ; refuse to work with buffer
- JAE OPEN2 ; smaller than 1K
- ISM: CALL ERROR_EXIT
- DB 'Insufficient memory', CR, LF, '$'
- OPEN2: MOV HANDLE,AX
- MOV FILE_NOT_CUSTOMIZABLE,1
- MOV LS_FILE_POSITION,0
- MOV MS_FILE_POSITION,0
-
- LOOP3: SUB SI,SI ; look for an id block
- SUB DI,DI
- MOV X0,0
- LOOP4: CMP X0,ID0 ; check for id block
- JNE ENTER4
- CMP X1,ID1
- JNE ENTER4
- CMP X2,ID2
- JNE ENTER4
- CMP X3,ID3
- JNE ENTER4
- CMP X4,ID4
- JNE ENTER4
- CMP X5,ID5
- JNE ENTER4
- JMP OUT4 ; found
- ENTER4: MOV AL,X1 ; circulate X0,X1,X2,X3,X4,X5
- MOV X0,AL
- MOV AL,X2
- MOV X1,AL
- MOV AL,X3
- MOV X2,AL
- MOV AL,X4
- MOV X3,AL
- MOV AL,X5
- MOV X4,AL
- CMP SI,DI ; any chars in buffer?
- JB SKPRD ; if so, skip read
- MOV AH,3FH
- INT 21H
- JNC READOK
- CALL ERROR_EXIT
- DB 'File read error', CR, LF, '$'
- READOK: OR AX,AX
- JNZ NOTEOF
- CMP FILE_NOT_CUSTOMIZABLE,0
- JZ NOREX
- CALL ERROR_EXIT
- DB 'File is not customizable', CR, LF, '$'
- NOREX: MOV DX,OFFSET S4
- JMP DISPLAY_STRING ; & RET
-
- NOTEOF: MOV SI,BUFFER
- MOV DI,SI
- ADD DI,AX
- SKPRD: CLD
- LODSB
- MOV X5,AL
- ADD LS_FILE_POSITION,1
- ADC MS_FILE_POSITION,0
- JMP LOOP4
-
- OUT4: PUSH BUFFER_SIZE
- PUSH BUFFER
- MOV FILE_NOT_CUSTOMIZABLE,0 ; back up to end of id block
- CALL SEEK
-
- LOOP5: MOV CHANGE_FLAG,0
- MOV AH,3FH
- MOV CX,1
- LEA DX,CHARACTER
- CALL READ_BLOCK
- CMP CHARACTER,0 ; first character of prompt
- JNE LOOP6
- JMP OUT5 ; end id block
- LOOP6: MOV DL,CHARACTER
- CALL DISPLAY_CHARACTER
- LEA DX,CHARACTER
- CALL READ_BLOCK
- CMP CHARACTER,0
- JNE LOOP6
- LEA DX,OLD_PARAMETER
- MOV CX,2
- CALL READ_BLOCK
- MOV AX,OLD_PARAMETER
- MOV LINE_BUFFER_LENGTH,6
- MOV DEFAULT_STRING_LENGTH,0
- SUB DX,DX
- PUSH DX
- LOOP7: SUB DX,DX
- DIV WORD PTR TEN
- ADD DL,'0'
- PUSH DX
- OR AX,AX
- JNZ LOOP7
- MOV DX,OFFSET S1
- CALL DISPLAY_STRING
- LEA DI,LINE_BUFFER
- LOOP8: POP AX
- OR AX,AX
- JZ OUT8
- CLD
- STOSB
- INC DEFAULT_STRING_LENGTH
- MOV DL,AL
- CALL DISPLAY_CHARACTER
- JMP LOOP8
- OUT8: MOV AL,CR
- STOSB
- MOV DX,OFFSET S2
- CALL DISPLAY_STRING
- MOV AH,10
- LEA DX,LINE_BUFFER_LENGTH
- INT 21H
- MOV DX,OFFSET S3
- CALL DISPLAY_STRING
- LEA SI,LINE_BUFFER
- MOV PARAMETER,0
- CLD
- LOOP9: LODSB
- CMP AL,CR
- JE OUT9
- SUB AL,'0'
- JB LOOP9
- CMP AL,9
- JA LOOP9
- MOV CHANGE_FLAG,1
- SUB AH,AH
- PUSH AX
- MOV AX,10
- MUL PARAMETER
- POP PARAMETER
- ADD PARAMETER,AX
- JMP LOOP9
- OUT9: CMP CHANGE_FLAG,0
- JE NOCH
- MOV AX,PARAMETER
- CMP AX,OLD_PARAMETER
- JE NOCH
- SUB LS_FILE_POSITION,2
- SBB MS_FILE_POSITION,0
- CALL SEEK
- LEA BUFFER,PARAMETER
- MOV BUFFER_SIZE,2
- CALL WRITE_BLOCK
- NOCH: JMP LOOP5
- OUT5: POP BUFFER
- POP BUFFER_SIZE
- JMP LOOP3
- BEGIN ENDP
-
- S1 DB ' [$'
- S2 DB ']: $'
- S3 DB CR, LF, '$'
- S4 DB 'Customization completed', CR, LF, '$'
- TEN DW 10
-
- DISPLAY_CHARACTER PROC NEAR
- MOV AH,2
- INT 21H
- RET
- DISPLAY_CHARACTER ENDP
-
- DISPLAY_STRING PROC NEAR
- MOV AH,9
- INT 21H
- RET
- DISPLAY_STRING ENDP
-
- ERROR_EXIT PROC NEAR
- POP DX
- CALL DISPLAY_STRING
- MOV AX,4C01H
- INT 21H
- ERROR_EXIT ENDP
-
- READ_BLOCK PROC NEAR
- MOV AH,3FH
- INT 21H
- JC RBERR
- CMP AX,CX
- JNZ RBERR
- ADD LS_FILE_POSITION,AX
- ADC MS_FILE_POSITION+2,0
- RET
- RBERR: CALL ERROR_EXIT
- DB 'File format or read error', CR, LF, '$'
- READ_BLOCK ENDP
-
- WRITE_BLOCK PROC NEAR
- MOV AH,40H
- INT 21H
- JC WBERR
- CMP AX,CX
- JNZ WBERR
- ADD LS_FILE_POSITION,AX
- ADC MS_FILE_POSITION+2,0
- RET
- WBERR: CALL ERROR_EXIT
- DB 'File write error', CR, LF, '$'
- WRITE_BLOCK ENDP
-
- SEEK PROC NEAR
- PUSH CX
- PUSH DX
- MOV CX,MS_FILE_POSITION
- MOV DX,LS_FILE_POSITION
- MOV AX,4200H
- INT 21H
- POP DX
- POP CX
- RET
- SEEK ENDP
-
- EVEN
- ID_BUFFER DB 6 DUP (0)
-
- CODE ENDS
-
- END BEGIN